package com.hejing.Thread类的常用方法和生命周期;

/**
 * ClassName: EvenNumberTest
 * Package: com.hejing.Thread类的常用方法和生命周期
 * Description:
 *
 * @Author: HeJing
 * @Create: 2023-04-14 15:21
 * @Version: 1.0
 */
public class EvenNumberTest {
    public static void main(String[] args) {

        // 设置主线程名称:
        Thread.currentThread().setName("主线程");
        // 设置主线程优先级:
        Thread.currentThread().setPriority(Thread.MAX_PRIORITY);

        // 步骤3: 创建当前Thread子类的对象
        PrintNumber test01 = new PrintNumber("线程01");
        // 设置子线程01名称和优先级
        test01.setName("子线程01");
        test01.setPriority(Thread.MIN_PRIORITY);

        // 步骤4: 调用start() 方法
        test01.start();
        // test01.start();

        PrintNumber02 test02 = new PrintNumber02();
        // 设置子线程02名称和优先级
        test02.setName("子线程02");
        test02.setPriority(Thread.NORM_PRIORITY);  // 其实默认就是 NORM_PRIORITY
        test02.start();

        /**
         * 问题1: 能否使用test01.run()替换test01.start()，实现分线程的创建和调用 ？
         *      答: 不能，此时调用run()方法只是一个简单的方法调用而已，并不能创建线程。
         *
         * 问题2: 再提供一个分线程，用于100以内偶数的遍历，该怎么做 ? 可以再一次调用test01.start() (共调两次 test01.start()) 吗 ?
         *      答: 不能让已经start的线程再次执行 xxx.start()操作，否则会报错: IllegalThreadStateException
         *      此时只能再次创建 Thread类的另一个子类.....
         */
        // main方法自己本身的操作:
        for (int i = 0; i < 100; i++) {
            /*try {
                Thread.sleep(100);
            } catch (InterruptedException e)  {
                e.printStackTrace();
            }*/

            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + " priority: "  +
                        Thread.currentThread().getPriority() + " : " + i);
            }

            if (i == 20) {
                try {
                    test01.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}


/**
 *  创建子线程01: 遍历100以内的奇数
 */
class PrintNumber extends Thread {
    // 构造器:
    public PrintNumber() {

    }

    public PrintNumber(String name) {
        super(name);
    }


    // 步骤2、重写run()方法--> 将此线程要执行的操作，声明在此方法体中。
    @Override
    public void run() {
        for(int i = 1; i <= 100; i++) {

            try {
                Thread.sleep(100);
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
            if (i % 2 != 0) {
                System.out.println(Thread.currentThread().getName() +
                        " priority: " + Thread.currentThread().getPriority() + "  : " + i);
            }

            if (i % 21 == 0 || i % 23 == 0) {
                Thread.yield();
            }
        }
    }

}

/**
 * 创建子线程02，遍历100以内的偶数
 */
class PrintNumber02 extends Thread {

    // 步骤2、重写run()方法--> 将此线程要执行的操作，声明在此方法体中。
    @Override
    public void run() {
        for(int i = 1; i <= 100; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() +
                        " priority: " + Thread.currentThread().getPriority() + " : " + i);
            }
        }
    }

}

